package com.example.demo;

import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class FunTool<T> {

    private static final FunTool<?> EMPTY = new FunTool<>();


    private final T value;


    private FunTool() {
        this.value = null;
    }


    public static<T> FunTool<T> empty() {
        @SuppressWarnings("unchecked")
        FunTool<T> t = (FunTool<T>) EMPTY;
        return t;
    }

    private FunTool(T value) {
        this.value = Objects.requireNonNull(value);
    }

    public static <T> FunTool<T> of(T value) {
        return new FunTool<>(value);
    }

    public static <T> FunTool<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }



}
